﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ebstate.h"
#include "station.h"
#include "udpinterface.h"
#include "dashboard.h"
#include <QWidget>
#include <QQueue>
#include <QTimer>
#include <QComboBox>
#include <QLabel>
#include <QTextBrowser>
#include <QHBoxLayout>





#if 0

#define DEBUG

#endif


#define COMMUNICATION_PATH (QString("/Config/Communication.json"))
#define CONFIG_PATH (QString("/Config/Config.json"))


// 报警
#define ALARM_NO_1 QString("动车时方式方向手柄变化")
#define ALARM_NO_2 QString("丢失位置")
#define ALARM_NO_3 QString("当前驾驶模式不可用")
#define ALARM_NO_4 QString("连续式列车冒进红灯")
#define ALARM_NO_5 QString("单轮打滑")
#define ALARM_NO_6 QString("双轮打滑")
#define ALARM_NO_7 QString("FAM模式因司机室钥匙激活正常退出")
#define ALARM_NO_8 QString("列车超速")
#define ALARM_NO_9 QString("倒溜超限")
#define ALARM_NO_10 QString("未授权回退")
#define ALARM_NO_11 QString("列车牵引受阻")
#define ALARM_NO_12 QString("列车发生非期望移动")
#define ALARM_NO_13 QString("列车车门未关闭锁闭时发生移动")
#define ALARM_NO_14 QString("空转打滑")
#define ALARM_NO_15 QString("超速报警1")
#define ALARM_NO_16 QString("超速报警2")
#define ALARM_NO_17 QString("回退可用")
#define ALARM_NO_18 QString("退行超限")
#define ALARM_NO_19 QString("回退激活")
#define ALARM_NO_20 QString("丢失定位应答器")
#define ALARM_NO_21 QString("非预期定位应答器")
#define ALARM_NO_22 QString("位置不确定性超限")
#define ALARM_NO_23 QString("模式选择无效")
#define ALARM_NO_24 QString("无效的激活车头状态输入")
#define ALARM_NO_25 QString("非法的RUN按钮输入")
#define ALARM_NO_26 QString("非法的客室门开/关门按钮输入")
#define ALARM_NO_27 QString("列车完整性丢失")
#define ALARM_NO_28 QString("轮径超标")
#define ALARM_NO_29 QString("轮径超限")
#define ALARM_NO_30 QString("轮径校准失败次数超限")
#define ALARM_NO_31 QString("轮径偏差超限")
#define ALARM_NO_32 QString("列车停站超时")
#define ALARM_NO_33 QString("扣车命令被拒绝")
#define ALARM_NO_34 QString("停站时间命令无效")
#define ALARM_NO_35 QString("跳停命令被拒绝")
#define ALARM_NO_36 QString("列车施加紧急制动")
#define ALARM_NO_37 QString("列车开门失败")
#define ALARM_NO_38 QString("列车关门失败")
#define ALARM_NO_39 QString("列车对站失败")
#define ALARM_NO_40 QString("站台门旁路激活")
#define ALARM_NO_41 QString("站台门旁路取消")
#define ALARM_NO_42 QString("连续丢失两个定位应答器")
#define ALARM_NO_43 QString("非法应答器信号")
#define ALARM_NO_44 QString("唤醒列车位置校验失败")
#define ALARM_NO_45 QString("建立定位失败")
#define ALARM_NO_46 QString("方向手柄零位时列车非法移动")
#define ALARM_NO_47 QString("可通过拔出钥匙进入FAM模式")
#define ALARM_NO_48 QString("ATO短距离发车失败")
#define ALARM_NO_49 QString("车辆出现制动重故障")
#define ALARM_NO_50 QString("门使能状态和门使能命令输出不一致")
#define ALARM_NO_51 QString("人工洗车按钮按下")
#define ALARM_NO_52 QString("紧急手柄拉下无效")
#define ALARM_NO_53 QString("运营等级命令无效")
#define ALARM_NO_54 QString("干湿轨命令无效")





QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE



class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void setDataProcessInterval(quint16 value);                         // 设置数据处理间隔

public slots:
    void getReceivedData(QByteArray data);                              // 接收数据
    void processMsg();                                                  // 数据处理
    void updateUI();

private:
    void initUI();                                                      // 显示界面初始化
    void initNetwork();                                                 // 网络初始化
    void initDataProcess();                                             // 数据处理初始化
    void selectMainNetwork();                                           // 主用网络选择
    void toBigEndian(RECEIVED_MSG* pMsg);                               // 结构体数据从小端转大端
    quint8 getBitValue(quint8 value, quint8 pos);                       // 获取1个字节中指定位置的值
    void getConfig(QString path);                                       // 获取配置
    void hideUI();

private:
    Ui::MainWindow *ui;
    EbState *pEb = NULL;
    Station *pDestination = NULL;
    Station *pNextStation = NULL;
    QComboBox *pPreSeleted = NULL;
    UdpInterface *pUdpSocket_J = NULL;                                  // J网接口
    UdpInterface *pUdpSocket_R = NULL;                                  // R网接口
    NETWORK mMainNet = NETWORK::INIT;                                   // 主用网络
    QQueue<RECEIVED_MSG> mReceivedMsgQueue;                             // 数据队列
    QTimer mDataProcessTimer;                                           // 数据处理定时器
    QTimer mDisplayTimer;                                               // 显示定时器
    QThread* pThread_J = NULL;                                          // J网子线程
    QThread* pThread_R = NULL;                                          // R网子线程
    QJsonObject* pStationDict = NULL;                                   // 车站字典
    quint8 mDashboardStyle = DASHBOARD_STYLE::DEFAULT;                  // 表盘风格
    QVector<quint16>* pDistScaleVector = NULL;                          // 距离刻度数组
    QLabel* pClockLabel;
    QTextBrowser* pAlarmWindow = NULL;
};
#endif // MAINWINDOW_H
